package com.xinwei.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.xinwei.generator.config.ParamsConfig;
import com.xinwei.generator.util.GennerCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Clausene
 */
@SpringBootApplication
@Slf4j
public class XinWeiGeneratorApplication {

    public static void main(String[] args) throws IOException {
        // 注意该工程需要引入lombok插件
        ParamsConfig params = new ParamsConfig();
        doGeneration(params);
    }
    public static void doGeneration(ParamsConfig params) throws IOException {

        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(params.getOutputDirectory());
        // 覆盖已生成的文件
        gc.setFileOverride(true);
        // 不需要ActiveRecord特性的请改为false
        gc.setActiveRecord(false);
        // XML ResultMap 生成RsultMap
        gc.setBaseResultMap(true);
        // XML columList 生成字段列表
        gc.setBaseColumnList(true);
        // 启用缓存
        gc.setEnableCache(false);
        // 是否生成后自动打开目录
        gc.setOpen(false);
        // 作者
        gc.setAuthor(params.getAuthor());

        // 自定义文件命名，注意 %s 会自动填充表实体属性！
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setEntityName("%sEntity");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setDriverName(params.getJdbcDriver());
        dsc.setUrl(params.getJdbcUrl());
        dsc.setUsername(params.getJdbcUserName());
        dsc.setPassword(params.getJdbcPassword());
        dsc.setTypeConvert(new MySqlTypeConvertCustom());
        mpg.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setCapitalMode(false);
        // 此处可以移除表前缀表前缀
        strategy.setTablePrefix(params.getRemoveTablePrefix());
        strategy.setRestControllerStyle(true);
        // 表名生成策略
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);

        // lombok支持
        strategy.setEntityLombokModel(params.isSetEntityLombokModel());

        // 实体字段对应表字段注解
        strategy.entityTableFieldAnnotationEnable(params.isFieldAnnotationEnable());
        // 需要生成的表
        strategy.setInclude(params.getIncludeTables());

        // 公共字段填充
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(new TableFill("creator", FieldFill.INSERT));
        tableFills.add(new TableFill("creator_name", FieldFill.INSERT));
        tableFills.add(new TableFill("create_time", FieldFill.INSERT));
        tableFills.add(new TableFill("updater", FieldFill.UPDATE));
        tableFills.add(new TableFill("updater_name", FieldFill.UPDATE));
        tableFills.add(new TableFill("update_time", FieldFill.UPDATE));
        strategy.setTableFillList(tableFills);
//        strategy.setSuperEntityClass("com.xinwei.olden.entity.BaseEntity");

        mpg.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(params.getParentPackage());
        pc.setModuleName("");
        pc.setXml("mapper.mapping");
        mpg.setPackageInfo(pc);

        List<FileOutConfig> focList = new ArrayList<>();
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
            }
        };
        // cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        // 执行生成
        mpg.execute();
        ConfigBuilder configBuilder = new ConfigBuilder(mpg.getPackageInfo(), mpg.getDataSource(), mpg.getStrategy(), mpg.getTemplate(), mpg.getGlobalConfig());
        GennerCodeUtils.gennerCodes(configBuilder);
    }
    /**
     * 自定义类型转换
     */
    static class MySqlTypeConvertCustom extends MySqlTypeConvert implements ITypeConvert {
        @Override
        public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
            String t = fieldType.toLowerCase();
            if (t.contains("tinyint(1)")) {
                return DbColumnType.INTEGER;
            }
            return super.processTypeConvert(globalConfig, fieldType);
        }
    }
}
